home *** CD-ROM | disk | FTP | other *** search
/ Carousel Volume 2 #1 / carousel.iso / mactosh / hc / windoid8.sit / Windoid #8
Text File  |  1989-01-31  |  52KB  |  1,056 lines

  1. December 1, 1988
  2.  
  3. WINDOID  #8
  4.  
  5. A Publication for the Informed HyperCard User
  6. and the Newsletter for the Apple HyperCard User Group
  7.  
  8. Editor -- David Leffler
  9.  
  10. IN THIS ISSUE:
  11.  
  12. Ñ HyperCard Tips by Phil Wyman
  13. Ñ Groupies 3.2 by Sioux Lacy
  14. Ñ HyperCard Novice Corner by Phil Wyman
  15. Ñ Edit Checking by the HyperTeam
  16. Ñ Spreadsheet Tips by the HyperTeam
  17. Ñ Sharing AHUG by Bryan Carter
  18. Ñ Sticking Windoids by Paul Foraker
  19. Ñ HyperCard 1.2.2 Release Notes by Mike Holm
  20.  
  21. ------------------------------------------------------------------------
  22.  
  23. Editor's Corner
  24. By David Leffler
  25.  
  26. Thank you all for your continued support of WINDOID and your many kind letters.  Keep them coming.   I'm sorry that it has been such  a long time between WINDOID issues and I promise the next issue will be out on schedule.  However, I hope that this issue will have been worth your extended wait.  We're very pleased that  you have enjoyed the efforts of our many friends and colleagues who contribute to these pages and actively encourage you to continue sending comments and suggestions to the HyperCard team.  We love the mail, and you might just inspire us to include your most wanted feature in the next version.  
  27. Speaking of new versions, we would like to introduce you to HyperCard version 1.2.2.  WINDOID #8 delineates HyperCard 1.2.2, the first world-wide release.
  28. For all of you dedicated users that are not in the United States, we  thank you for your patience.  Many people have worked very long, hard hours here at Apple to give the world the power of Apple HyperCard.  We know you'll love it!
  29.  
  30. "NOTE:  Developers who plan to license and ship HyperCard with their products outside the United States should use version z1.2.2, which contains a special resource for handling non-U.S. date, currency, and other number formats.  Contact Apple Software Licensing for details on distributing HyperCard with third-party products."
  31.  
  32. Inside WINDOID
  33.  
  34. In WINDOID #8 Phil Wyman, HyperCard tester, continues to support you with both his PowerTips column and a new Novice Corner for those of you, who in the words of an avid WINDOID reader, "wouldn╒t know a global variable from a dead fish!"  Sioux Lacy shares with you Groupies 3.2, an update from her version 1.3 submitted in WINDOID #4.  Bryan Carter, AHUG President, Paul Foraker of HyperPro in Cupertino, and other HyperTeam friends have submitted some very helpful stack design utilities.  Additionally, Bryan wants to make you a member of AHUG and actively encourages you to form your own AHUG SIG.  AHUG will generously assist you in various ways to make your stacks much more shareable and will continue to participate in getting your WINDOID delivered to your home or business address.  Details for AHUG international membership will be  announced at MacWorld San Francisco in January.  For further information on AHUG meeting times and agenda.  The  number is:  408-974-1707.  Finally, Mike Holm, HyperCard Product Manager, brings us the HyperCard version 1.2.2 Programmer╒s Notes for the definitive look.
  35.  
  36. Stack Design Guidelines
  37.  
  38. Not all stack designers start out equal.  Some have an advantage.  Professional stackware design has gotten considerably easier with HyperCard Stack Design Guidelines from Addison-Wesley.  Written here at Apple Cupertino by Rachel Rutherford and staff, this book is as MacWeek reviews it, "one of the most useful HyperCard books we╒ve seen,"  and "This is a 'must have' book for serious HyperCard developers."  I could not agree more.  Great job Rachel et al!
  39.  
  40. HyperCard╒s First Birthday Party
  41.  
  42. The Apple HyperCard One Year Birthday Party, MacWorld Boston,  Yahoo, What A Party!!  Since I work in California, I can say that it was "Totally Awesome."  Many East Coast friends who attended said the same.  Apple culture at its best.
  43. Cynthia Macon, Apple Public Relations, and Lynn Knerr, Macintosh Third-Party Marketing, among many other greats, threw a WingDing.  The food was plentiful, the service excellent, the music rocked, and the people, oh the people, were incredible.  Everyone that could attend was there, and we all shared one thing ╤ an unbridled love for HyperCard.  1500 happy, dancing people.  We wish that all of you could have been there.
  44.  
  45. ------------------------------------------------------------------------
  46.  
  47. If you would like information about AHUG, write to: 
  48. Apple HyperCard User Group
  49. MS/27-AHUG
  50. 20525 Mariani Ave.
  51. Cupertino, CA 95014
  52. Our AppleLink is:  UG.AHUG 
  53. If you have a bug, suggestion, or HyperCard comments use the Form. 
  54. Or copy the format and Apple-Link¬ it to: 
  55. HYPERBUG$
  56.  
  57. ------------------------------------------------------------------------
  58.  
  59. Power Tips
  60. by Phil Wyman
  61.  
  62. 1) If you are using Finder and not MultiFinder, there is a nice option you should know about.  If you are in HyperCard, and you open an application, i.e., Microsoft Word, when you quit the open application, you return to HyperCard. However, if you want to go directly to the Finder and not back to HyperCard, hold down the Option key while quitting the application.
  63.  
  64. 2)  You can bring an object all the way to the top by using Shift-Command-Plus or send it all the way to the bottom with Shift-Command-Minus.  Be very careful when using Command-Plus to bring a button or a field one object closer. If you hit Command Backspace (or Command Delete), which is right next to the Plus key, you will delete the card (if it╒s unprotected).
  65.  
  66. 3) Scripts are not saved until you click OK in the script editor. Be sure to do this often, even if you╒re not finished working on your script. One problem I had was working for a long time fine-tuning a script and accidentally hitting Cancel instead of OK. You lose all your changes that way.  Additionally, it╒s really smart to periodically save a copy of your stack as a backup.  
  67.  
  68. 4) Sometimes your "if then else╒s" don╒t indent properly and it╒s very difficult to understand why. Here╒s a couple of possible debug tips.  1) Look for an "exit <handlerName>", where handlerName is not the current handler.  2) Indent problems can also happen if you just say "if" and forget to say "then". For example, the following will not indent:     
  69.  
  70.     if x=0 
  71.           put x into z
  72.     end if    
  73.  
  74. 5) If you click in the space beneath the last text entered in a field, you will get extra returns in the field down to the point where you clicked. If you don╒t want those extra returns, Shift-Clicking anywhere beneath the last of the text in a field puts the cursor directly after the last character of the field without putting in returns.   
  75.   
  76. 6) "Show all cards" shows each card once. However, "show cards" will keep showing all the cards in the stack forever╤or until the mouse click, whichever comes first.
  77.  
  78. 7) To clear a global variable, put empty into the variable.
  79.  
  80.  
  81. 8) If you were using 1.1 or 1.0.1 before you installed version 1.2, you may have kept your old Home stack. There are, however some nifty new handlers in the 1.2 Home stack script.  You should add them to your home stack script. The new handlers do the following when typed into the message box:
  82.  
  83. "xy" puts the mouse location into the message box until the next mousedown.
  84. "c" does a doMenu "Card Info..."
  85. "b" does a doMenu "Bkgnd Info..."
  86. "s" does a doMenu "Stack Info..."
  87.  
  88. Interestingly, if after typing "s" into the message box you press the Shift key when hitting the Enter key, you will get the script of the stack. This is the same as if you had chosen the menu item "Stack Info..." with the Shift key depressed.
  89.  
  90. 9) To send a typed arrowKey in HyperTalk, use "arrowKey right", or "arrowKey left", etc.
  91.  
  92. 10) From James Francis Redfern, HyperCard tester, comes a workaround for getting user Key Strokes: Show message window off-screen and have the user type into the message window. Then get what they typed.
  93.  
  94. 11) You may already know that in the script editor, once you have done a "find", you can do a CMD-G to "Go" to the next occurrence of the found string. But an even neater way is to type CMD-H to find the next occurrence of the highlited string, without ever having done a find!
  95.  
  96. 12)  Sometimes, when you need to place a field or a button in the background, it╒s very difficult to tell where to place it since when you edit the background, the cards foreground information is not visible. A solution is to create the field or button on the card level in exactly the spot you would like it to appear, then select it and cut it. Then go into the Background and Paste it. It will be in exactly the right spot!   Another workaround would be to just create it willy-nilly on the background, then go to the foreground (card level). You will then be able to manipulate your background buttons and fields from the foreground!
  97.  
  98. 13)  From Paul Foraker of HyperPro...  If you want to paste into the message window, most people think that you first have to click in the empty message window with the mouse.  Here╒s a shortcut which bypasses the mouse and keeps your fingers on the keyboard.  Hit the Backspace (or Delete) key. This deletes any message you have in the message box. Even without a cursor in the message window, or any text in the message window, if you hit Backspace (or Delete) you will get a cursor in the empty message window.  You can then paste without  having to use the mouse to select the message window first.
  99.  
  100. 14)  To get to the end of a long script in a flash without scrolling, try CMD-A then right arrowKey!
  101.  
  102. 15)  You have to be careful when asking for the result. For instance, consider the following script:
  103.  
  104. find "findwhat"
  105. put "test" into var
  106. if the result is "not found" then answer "not found"
  107.  
  108. The above script won╒t answer "not found". The result  has to be asked for on the next line of code:
  109.  
  110. find "findwhat"
  111. if the result is "not found" then answer "not found"
  112. put "test" into var
  113.  
  114. 16)  To test whether you have version 1.2.2, put the following handler in your stack script:
  115.  
  116. on openStack
  117.     if the long version < 01228000 then (do whatever) 
  118.     --you have an older version of HyperCard
  119.     else (do whatever) 
  120.     --you have at least version 1.2.2 or higher of HyperCard
  121. end openStack
  122.  
  123. 17) From Scott Bongiorno HyperCard tester╔ Here's a handler to display the current shipping version of HyperCard.
  124. This handler gets and converts the value of the long version and displays it in the message box as the shipping version number.
  125.  
  126. Editors Note: Remember that the Box Characters are Option-Return
  127.  
  128. on theVers
  129.   put the long version into thisVers
  130.   put char 2 of thisVers & "." & char 3 of thisVers & "." &┬
  131.   char 4 of thisVers into thisLongVers
  132.   put  "Version" && thisLongVers into the msg
  133. end theVers
  134.  
  135. ------------------------------------------------------------------------
  136.  
  137. Groupies 3.2
  138. by Sioux Lacy
  139.  
  140. It's been a while since the first Groupies script appeared in WINDOID, and a number of  improvements have been made to it since then.
  141.  
  142. For those of you who are unfamiliar with Groupies, I'll take a moment to explain what it is.   Before I was involved with computers, I was a graphic artist, and when I worked with compositions of type and graphic elements, I insisted on having them perfectly lined up with exactly the same amount of space between them.  So, naturally, I expected to be able to equal-space and line up HyperCard objects as well.  
  143.  
  144. "Groupies" is a HyperTalk tool that I created to manipulate groups of objects.  It lets you specify any number of HyperCard buttons and / or fields as members of a group.  Then, you may drag that group to a new location, align all the items in the group, put a fixed amount of space between them, or copy and paste the group into a new location.
  145.  
  146. "Groupies 3.2" is a stack containing this grouping tool in several formats.  You may have seen the stack at HyperCard Users' Groups or on bulletin boards, and, if so, I recommend that you copy the entire stack.  However, if you don't have access to the stack through other outlets, please copy its script (shown below).  Putting this script into a stack or into your Home stack will give you a way to work with groups of objects by sending the Groupies messages.
  147.  
  148. The Groupies Messages
  149. Group lets you select the members of the group.  Note that making a new group overwrites the previous group, so you can only designate one group at a time.
  150.  
  151. Move lets you drag all the members of your group to a new location.
  152.  
  153. Copy lets you copy the group for future pasting.  The group members are "remembered," so you can go to another card or another stack and paste them.
  154.  
  155. Paste lets you paste copies of the group into a new environment.  Note that objects are pasted into the same layer that they came from but will not retain their same IDs.  
  156. For example, if you copy a group that contains bkgnd button IDs 5, 6 and 7, and then you paste them into the same background, the copies will have different, unique IDs, and you will have twice as many objects as before.  The group, however, still consists of IDs 5, 6 and 7.  
  157.  
  158. Erase will delete all the objects in the group.  There is no way to undo this operation, so don't click OK unless you mean it.
  159.  
  160. Align lets you line up members of the group horizontally or vertically.
  161.  
  162. Adjust will put an equal amount of space between the members of the group.  You will show it how much space you want.
  163.  
  164.  
  165. The Groupies Script
  166.  
  167. ---------------------------------------------------------------------
  168. -- Groupies 3.2, a utility for grouping objects, by Sioux Lacy
  169. -- This script is public domain.  Happy grouping!
  170. -- 
  171. -- Many thanks to Bill Atkinson for his encouragement,
  172. -- and, of course, for HyperCard
  173. ---------------------------------------------------------------------
  174.  
  175. -- You don't need to copy this first handler to your Home stack
  176. -- unless you have an extended keyboard (with function keys).
  177.  
  178. -- On an extended keyboard, this handler can be used to do Groupies
  179. -- messages by typing the function keys.  It uses keys F5 thru F11.
  180.  
  181. on functionKey whichKey
  182.   global objectList
  183.   if whichKey < 5 or whichKey > 11 then pass functionKey
  184.   if whichKey is 5 then Group
  185.   else if whichKey is 6 then Move
  186.   else if whichKey is 7 then Copy
  187.   else if whichKey is 8 then Paste
  188.   else if whichKey is 9 then Erase
  189.   else if whichKey is 10 then Align
  190.   else if whichKey is 11 then Adjust
  191. end functionKey
  192.  
  193. ---------------------------------------------------------------------
  194. -- GROUPIES HANDLERS START HERE
  195. ---------------------------------------------------------------------
  196.  
  197. -- Message: Group
  198. -- This will let the user designate a number of objects to be grouped
  199. -- either by clicking on them, or showing a surrounding rectangle
  200.  
  201. on Group
  202.   global objectList, whereTheGroupIs
  203.   put "Objects" into selectMethod  -- default method
  204.   if the optionKey is down then
  205.     put Choice("Group objects by selecting:", "Objects", "Area") ┬
  206.     into selectMethod
  207.   end if
  208.   if selectMethod is "Objects" then
  209.     Confirm "Click buttons or fields, then press command."
  210.     put empty into objectList
  211.     put empty into whereTheGroupIs
  212.     repeat until the commandKey is down
  213.       set cursor to arrow
  214.       if the mouseClick then
  215.         set cursor to watch
  216.         put HitTest(the clickLoc) into hitWhat
  217.         if hitWhat is not empty and hitWhat is not in objectList
  218.         then put hitWhat & "," after objectList
  219.         else beep  -- invalid hit or nothing hit
  220.       end if
  221.     end repeat
  222.   else   -- selectMethod is "Area"
  223.     Confirm "Use 2 clicks to show opposite corners of area."
  224.     put empty into objectList
  225.     put empty into whereTheGroupIs
  226.     set cursor to cross
  227.     wait until the mouseClick
  228.     put the clickLoc into selectRect
  229.     DrawMarker selectRect
  230.     wait until the mouseClick
  231.     put "," & the clickLoc after selectRect
  232.     DrawMarker the clickLoc
  233.     set cursor to watch
  234.     EraseMarkers
  235.     WithinRect selectRect
  236.   end if
  237.   delete last char of objectList   -- get rid of trailing comma
  238.   choose browse tool
  239. end Group
  240.  
  241. -- Message: Move
  242. -- This will reposition (on the current card) all the
  243. -- grouped objects.
  244. -- They will follow the mouse location.
  245.  
  246. on Move
  247.   global objectList
  248.   CheckGroup
  249.   Confirm "Click and drag the group with mouse down."
  250.   set cursor to arrow
  251.   wait until the mouse is down
  252.   put the mouseLoc into thisLoc
  253.   repeat while the mouse is down
  254.     put thisLoc into lastLoc
  255.     put the mouseLoc into thisLoc
  256.     if thisLoc is not lastLoc then
  257.       put item 1 of thisLoc - item 1 of lastLoc into deltaX
  258.       put item 2 of thisLoc - item 2 of lastLoc into deltaY
  259.       lock screen
  260.       repeat with i = 1 to the number of items in objectList
  261.         put item i of objectList into object
  262.         get location of object
  263.         add deltaX to item 1 of it
  264.         add deltaY to item 2 of it
  265.         set location of object to it
  266.       end repeat
  267.       unlock screen
  268.     end if
  269.   end repeat
  270. end Move
  271.  
  272. -- Message: Copy
  273. -- This will remember, in a global variable, the current card.  Then,
  274. -- when the user 'pastes', the objects will be copied from that card.
  275.  
  276. on Copy
  277.   global whereTheGroupIs, savedUserLevel
  278.   CheckGroup
  279.   put the userLevel into savedUserLevel
  280.   set the userLevel to 5   -- will be restored after 'Paste'
  281.   Confirm "Go wherever you wish and 'Paste'."
  282.   put the long id of this card into WhereTheGroupIs
  283. end Copy
  284.  
  285. -- Message: Paste
  286. -- This will paste all the objects in the group into the current card /
  287. -- background. It must be preceded by 'Copy'.
  288.  
  289. on Paste
  290.   global objectList, WhereTheGroupIs, savedUserLevel
  291.   CheckGroup
  292.   if WhereTheGroupIs is empty
  293.   then Abort "Please choose 'Copy' before 'Paste'."
  294.   set cursor to watch
  295.   set lockMessages to true
  296.   lock screen
  297.   repeat with i = 1 to the number of items in objectList
  298.     push this card
  299.     go to WhereTheGroupIs
  300.     put item i of objectList into object
  301.     if word 2 of object is "field"
  302.     then put the value of object into copyOfText
  303.     select object
  304.     type "C" with commandKey
  305.     pop card
  306.     set editBkgnd to (word 1 of object = "bkgnd")
  307.     type "V" with commandKey
  308.     if word 2 of object is "field" then
  309.       if word 1 of object is "bkgnd"
  310.       then put copyOfText into bkgnd field (the number of bkgnd fields)
  311.       else put copyOfText into card field (the number of card fields)
  312.     end if
  313.   end repeat
  314.   choose browse tool
  315.   unlock screen
  316.   set the userLevel to savedUserLevel
  317.   Prompt "These new objects are not grouped. The old group is still valid."
  318. end Paste
  319.  
  320. -- Message: Erase
  321. -- This will delete all the objects in the group. They are removed
  322. -- from the stack, and the operation is not undoable.
  323.  
  324. on Erase
  325.   global objectList, WhereTheGroupIs
  326.   CheckGroup
  327.   Confirm "Deleting group is not undoable. Are you sure?"
  328.   repeat with i = the number of items in objectList down to 1
  329.     select item i of objectList
  330.     type "X" with commandKey
  331.   end repeat
  332.   put empty into objectList
  333.   put empty into WhereTheGroupIs
  334.   choose browse tool
  335. end Erase
  336.  
  337. -- Message: Align
  338. -- This will line up the objects flush left, right, top or bottom,
  339. -- depending on the user's wishes.
  340.  
  341. on Align
  342.   global objectList
  343.   CheckGroup
  344.   put Choice("Adjust members by moving them:","Left/Right","Up/Down") ┬
  345.   into axis
  346.   if axis is "Up/Down"
  347.   then answer "Align objects at:" with "Top" or "Bottom" or "Center"
  348.   else answer "Align objects at:" with "Left" or "Right" or "Center"
  349.   put it into alignment
  350.   Confirm "Click where you wish them to align."
  351.   set cursor to cross
  352.   wait until the mouseClick
  353.   if alignment is "Center" then
  354.     repeat with i = 1 to the number of items in objectList
  355.       put item i of objectList into object
  356.       get location of object
  357.       if axis is "Up/Down"
  358.       then put the clickV into item 2 of it
  359.       else put the clickH into item 1 of it
  360.       set location of object to it
  361.     end repeat
  362.   else
  363.     repeat with i = 1 to the number of items in objectList
  364.       put item i of objectList into object
  365.       if axis is "Up/Down" then
  366.         if alignment is "Top"
  367.         then set top of object to the clickV
  368.         else set bottom of object to the clickV
  369.       else if axis is "Left/Right" then
  370.         if alignment is "Left"
  371.         then set left of object to the clickH
  372.         else set right of object to the clickH
  373.       end if
  374.     end repeat
  375.   end if
  376. end Align
  377.  
  378. -- Message: Adjust
  379. -- This will put an equal amount of 'white' space between consecutive
  380. -- objects in the group. Note that the objects must be in ascending
  381. -- order for this to work as expected.
  382.  
  383. on Adjust
  384.   global objectList
  385.   CheckGroup
  386.   put Choice("Adjust space between objects:","Horizontally","Vertically") ┬
  387.   into adjust
  388.   Confirm "Use 2 clicks to show desired spacing."
  389.   set cursor to cross
  390.   wait until the mouseClick
  391.   put the clickLoc into startLoc
  392.   DrawMarker startLoc
  393.   wait until the mouseClick
  394.   put the clickLoc into endLoc
  395.   DrawMarker endLoc
  396.   SortGroup adjust
  397.   if adjust = "Horizontally" then
  398.     put abs(item 1 of endLoc - item 1 of startLoc) into horizSpace
  399.     put right of item 1 of objectList into lastRight
  400.     repeat with i = 2 to the number of items in objectList
  401.       put item i of objectList into object
  402.       set left of object to lastRight + horizSpace
  403.       put right of object into lastRight
  404.     end repeat
  405.   else  -- adjust "Vertically"
  406.     put abs(item 2 of endLoc - item 2 of startLoc) into vertSpace
  407.     put bottom of item 1 of objectList into lastBottom
  408.     repeat with i = 2 to the number of items in objectList
  409.       put item i of objectList into object
  410.       set top of object to lastBottom + vertSpace
  411.       put bottom of object into lastBottom
  412.     end repeat
  413.   end if
  414.   EraseMarkers
  415. end Adjust
  416.  
  417. -------------------------------------------------------------
  418.  
  419. on Abort what
  420.   answer what
  421.   exit to HyperCard
  422. end Abort
  423.  
  424. on CheckGroup
  425.   global objectList
  426.   if objectList is empty then Abort "There are no objects in the group."
  427. end CheckGroup
  428.  
  429. function Choice prompt, choice1, choice2
  430.   answer prompt with choice1 or choice2 or "Cancel"
  431.   if it is "Cancel" then exit to HyperCard
  432.   return it
  433. end Choice
  434.  
  435. on Confirm what
  436.   answer what with "Cancel" or "OK"
  437.   if it is "Cancel" then exit to HyperCard
  438. end Confirm
  439.  
  440. on DrawMarker where
  441.   lock screen
  442.   doMenu "New Button"
  443.   put the number of card btns into newBtn
  444.   set icon of card btn newBtn to "Marker Cross"
  445.   set style of card btn newBtn to transparent
  446.   set showName of card btn newBtn to false
  447.   set rect of card btn newBtn to 0,0,20,20
  448.   set loc of card btn newBtn to where
  449.   set name of card btn newBtn to empty
  450.   choose browse tool
  451.   unlock screen
  452. end DrawMarker
  453.  
  454. on EraseMarkers
  455.   lock screen
  456.   select card btn (the number of card btns)
  457.   doMenu "Clear Button"
  458.   select card btn (the number of card btns)
  459.   doMenu "Clear Button"
  460.   choose browse tool
  461.   unlock screen
  462. end EraseMarkers
  463.  
  464. function HitTest where
  465.   repeat with i = the number of card buttons down to 1
  466.     if where is within rect of card button i then
  467.       if visible of card button i
  468.       then return "card button id " & the id of card button i
  469.     end if
  470.   end repeat
  471.   repeat with i = the number of card fields down to 1
  472.     if where is within rect of card field i then
  473.       if visible of card field i
  474.       then return "card field id " & the id of card field i
  475.     end if
  476.   end repeat
  477.   repeat with i = the number of bkgnd buttons down to 1
  478.     if where is within rect of bkgnd button i then
  479.       if visible of bkgnd button i
  480.       then return "bkgnd button id " & the id of bkgnd button i
  481.     end if
  482.   end repeat
  483.   repeat with i = the number of bkgnd fields down to 1
  484.     if where is within rect of bkgnd field i then
  485.       if visible of bkgnd field i
  486.       then return "bkgnd field id " & the id of bkgnd field i
  487.     end if
  488.   end repeat
  489.   return empty
  490. end HitTest
  491.  
  492. on Prompt what
  493.   put what
  494.   put the seconds into startTime
  495.   put the mouseLoc into startLoc
  496.   wait until (the seconds = startTime+10) or (the mouseLoc <>┬ startLoc)
  497.   put empty into message box
  498.   hide message box
  499. end Prompt
  500.  
  501. on SortGroup how
  502.   global objectList
  503.   put empty into sortedList
  504.   if how is "Vertically" then put true into verticalSort
  505.   else put false into verticalSort
  506.   repeat with i = 1 to the number of items in objectList
  507.     put false into inserted
  508.     if verticalSort then get top of item i of objectList
  509.     else get left of item i of objectList
  510.     repeat with j = 1 to the number of items in sortedList
  511.       if (verticalSort and (it < top of item j of sortedList)) or ┬
  512.       (not verticalSort and (it < left of item j of sortedList)) then
  513.         put item i of objectList & "," before item j of sortedList
  514.         put true into inserted
  515.         exit repeat
  516.       end if
  517.     end repeat
  518.     if inserted is false then put item i of objectList & "," after ┬
  519.     sortedList
  520.   end repeat
  521.   delete last char of sortedList
  522.   put sortedList into objectList
  523. end SortGroup
  524.  
  525. on WithinRect selectRect
  526.   global objectList
  527.   repeat with i = the number of card buttons down to 1
  528.     if the loc of card button i is within selectRect then
  529.       if visible of card button i
  530.       then put "card button id " & the id of card button i ┬
  531.       & "," after objectList
  532.     end if
  533.   end repeat
  534.   repeat with i = the number of card fields down to 1
  535.     if the loc of card field i is within selectRect then
  536.       if visible of card field i
  537.       then put "card field id " & the id of card field i ┬
  538.       & "," after objectList
  539.     end if
  540.   end repeat
  541.   repeat with i = the number of bkgnd buttons down to 1
  542.     if the loc of bkgnd button i is within selectRect then
  543.       if visible of bkgnd button i
  544.       then put "bkgnd button id " & the id of bkgnd button i ┬
  545.       & "," after objectList
  546.     end if
  547.   end repeat
  548.   repeat with i = the number of bkgnd fields down to 1
  549.     if the loc of bkgnd field i is within selectRect then
  550.       if visible of bkgnd field i
  551.       then put "bkgnd field id " & the id of bkgnd field i ┬
  552.       & "," after objectList
  553.     end if
  554.   end repeat
  555. end WithinRect
  556.  
  557.  
  558.  
  559. An Example of How You Might Use The Groupies Messages
  560.  
  561. Imagine that you've put the script into a stack that you're working with.  And, on the first card of your stack you have 6 card buttons that you want to have lined up across the bottom of the card.  So you would do the following:
  562.  
  563. Type "Group" into the message box.  A confirmation dialog will prompt you to click on each of the objects that you want to be included in the group, and then to press the Command key.  The dialog also has a cancel button so you can change your mind.
  564.  
  565. So click OK, and then click on each of the 6 buttons.  Press Command and your group will be complete.  (Note that it's difficult to click on objects if they are behind other objects.  So for purposes of grouping, you might separate any overlapping ones.  Then, after they're grouped, you can move them back to their original positions.)
  566.  
  567. Now invoke the "Align" message by typing it into the message box.  A dialog will ask you whether you want to move the group members left and right or up and down.  In order to align the buttons horizontally, you will want to click on "Up/Down".  Then answer the next dialog that appears with "Bottom" to align their bottom edges.  The next prompt will ask you to click to show an alignment guide.  Click anywhere along the horizontal line where you want them positioned.  
  568.  
  569. Then the "Align" handler will move the objects for you.  In general, the Groupies handlers prompt you each step of the way through the procedure you've chosen to execute.  I think it's still a good idea to test drive the handlers by making a practice stack with a lot of buttons and fields, and try out the various Groupies messages.  Thanks, and happy grouping!
  570.  
  571. ------------------------------------------------------------------------
  572.  
  573. HyperCard Novice Corner 3
  574. by Phil Wyman
  575.  
  576. A message from Phil Russell of Waldport, Oregon, inspired me to write yet another Novice Corner. He writes, "WINDOID is great! Please give lots of 'rest of us' hints! I wouldn't know a global variable from a dead fish!"
  577.  
  578. Well, global variables are indeed too sticky a subject for the "rest of us" novices. So let's have some real fun painting with HyperCard!
  579.  
  580. To use the "paint" tools, we need to be sure that we're at a high enough user level to have access to those tools on our menubar. If that sounds confusing, bear with me. The fun will be worth the slight hassle. What we have to do to prepare is:
  581.  
  582. 1) Be on the Home card. If you aren't, and are in another stack, choose "Home" from the "Go" Menu at the top of your screen.  Otherwise, when you click on HyperCard in the Finder you will always be taken directly to the Home card.  If your menubar is not visible, press both the Command key and the Spacebar to show it.
  583.  
  584. 2) Click on the left arrow button at the bottom of your Home card to go to the User Preferences card.  Here you can set your "userLevel".
  585.  
  586. 3) Click on a user level of either Painting, Authoring, or Scripting.
  587.  
  588. 4) Click on the right arrow at the bottom of your User Preferences card, and you should be back on your Home card.
  589.  
  590. 5) From the Edit menu on top of your screen, choose "New Card".
  591.  
  592. OK. We now have a blank white card to paint on. Let's have some HyperCard paint fun. 
  593.  
  594. 6) Hold down the Option key while pressing the Tab key. This will put the tools palette in the middle of your card. 
  595.  
  596. 7) Click on the Rectangle tool, which is in the middle column right next to the Spray Can tool and below the Erasure tool.
  597.  
  598. 8) From the Options menu on top of your screen, choose "Draw Multiple". Look at the Options menu again to be sure that the "Draw Multiple" choice is now checked with a checkmark.
  599.  
  600. Here comes the fun part. Click the mouse on a white portion of your blank card and hold the mouse button down. Move the mouse around. This is called dragging the mouse. You will get some nice effects.  Try it with the Grid option checked both on and off.  
  601.  
  602. You can erase what you draw by either double-clicking on the Erasure tool to erase everything you have drawn, or erase only the last thing you drew by pressing the Tilde key, located above the Tab key.  A single click on the Erasure tool allows you use this tool to selectively erase parts of your painting.
  603.  
  604. For different effects, choose "Draw Centered" from the Options menu. Once again, click the mouse, hold the mouse button down, and move the mouse around.  Try choosing the Oval tool from the tool palette and doing the same things we did with the Rectangle tool. The Oval tool is right below the Rectangle tool.  The Shift key constrains the tools to perfect squares and circles.
  605.  
  606. You will find that the faster you move the mouse the greater distance the lines will be apart.  With a little practice you can draw amazing graphic elements for your stacks in just a few seconds.
  607.  
  608. ------------------------------------------------------------------------
  609.  
  610. Spreadsheet Tips
  611. by the HyperTeam
  612.  
  613. Some users have asked for scripts that allow fields to work like spreadsheets.  We looked at some of the new 1.2 features and would like to share these with you.  Tab, Return, and Arrow keys will move the selection up, down, and from field to field much like a spreadsheet.  We hope you enjoy them and have a very Merry Christmas.
  614.  
  615. To begin: Create some non-scrolling fields and put the following into your card script:
  616.  
  617. on tabKey
  618.   get the selectedLine
  619.   if it is empty then put "line 1 of bkgnd field 0" into it
  620.   add 1 to word 6 of it
  621.   if word 6 of it > 3 then
  622.     put 1 into word 6 of it
  623.     add 1 to word 2 of it
  624.   end if
  625.   select it
  626. end tabKey
  627.  
  628. on returnInField
  629.   get the selectedLine
  630.   if word 2 of it < 10 then add 1 to word 2 of it
  631.   put 1 into word 6 of it
  632.   select it
  633. end returnInField
  634.  
  635. on arrowKey direction
  636.   if the commandKey is down or the optionKey is down┬
  637.   or the shiftKey is down then pass arrowKey
  638.   get the selectedLine
  639.   if "field" is not in it then pass arrowKey
  640.   if direction = "up" and word 2 of it > 1
  641.   then subtract 1 from word 2 of it
  642.   if direction = "down" and word 2 of it < 10
  643.   then add 1 to word 2 of it
  644.   if direction = "left" and word 6 of it > 1
  645.   then subtract 1 from word 6 of it
  646.   if direction = "right" and word 6 of it < 3
  647.   then add 1 to word 6 of it
  648.   select it
  649. end arrowKey
  650.  
  651. ------------------------------------------------------------------------
  652.  
  653. Edit Checking
  654. by the HyperTeam
  655.  
  656. When you set up your four fields, make sure that Auto Tab is selected in Field Info.  These techniques make data entry much more accurate and faster.  You must have version 1.2 or newer to use these scripts:
  657. --Age field:Check for integer in the range 1 to 99.
  658. on closeField
  659.   get me
  660.   repeat with i = 1 to length(it)
  661.     if char i of it is not in "0123456789" then
  662.       beep
  663.       select text of me
  664.       exit closeField
  665.     end if
  666.   end repeat  
  667.   if it < 1 or it > 99 then
  668.     beep
  669.     select text of me
  670.   end if
  671. end closeField
  672.  
  673. --Gender field:Check for male or female.
  674. on closeField
  675.   get char 1 of me
  676.   if it is "m" then put "Male" into me
  677.   else if it is "f" then put "Female" into me
  678.   else
  679.     beep
  680.     select text of me
  681.   end if
  682. end closeField
  683.  
  684. --Date Field:Check for a valid date.
  685. on closeField
  686.   get me
  687.   convert it to date
  688.   if it is not me then
  689.     beep
  690.     select text of me
  691.   end if
  692. end closeField
  693.  
  694. --Time Field:Check for a valid time
  695. on closeField
  696.   get me
  697.   convert it to time
  698.   if it is not me then
  699.     beep
  700.     select text of me
  701.   end if
  702. end closeField
  703.  
  704. ------------------------------------------------------------------------
  705.  
  706. Sharing AHUG
  707. By Bryan K. Carter
  708.  
  709.  
  710.     Many people send us their forms from the back of WINDOID and ask me what is the "best" way to do something in HyperCard.  Sorry, there really isn't one "best" way.  HyperCard was designed to build on your ingenuity and individual strengths.  Fortunately, there are some good basic techniques.  After all, once the basics are mastered, the rest of the time can be spent on stack design, creativity, and functionality.
  711.     The one thing I dislike in a stack is a script that changes my Home stack User Preferences and doesn't set them back.  When a person designs a stack and alters the user's pre-set preferences, they need to make certain to set them back.  Yes, it could mean a few extra lines of HyperTalk, but it also means much happier users.  
  712.     When the Home stack is opened from the Finder, the handler getHomeInfo (residing in the stack script of the Home stack) is called from the on startUp handler.  When a stack other than the Home stack is opened from the Finder, it may or may not allow the getHomeInfo handler to be called (depending upon the handlers it traps and/or passes), thus limiting or nullifying the users' preferences.  I find this script helpful in this situation:
  713.  
  714. on openStack
  715.     global stacks
  716.     if stacks is empty then getHomeInfo
  717.     --your code
  718.     --goes here
  719.     pass openStack
  720. end openStack
  721.  
  722.     HyperCard uses the global variable "stacks" to keep a directory of all the places your stacks are located.  This "directory" is also in a field on the "Stacks" card in your Home stack.  The handler getHomeInfo stores this information.  Thus, if the global "stacks"  is empty, then either getHomeInfo has not been called yet, or the field on the card "Stacks" in the Home stack is empty.  Either way, by calling getHomeInfo if the global "stacks" is empty, you are getting all the user's preferences before you begin.  You can then take advantage of those settings later in your script.
  723.  
  724.     Other general script-tips are the following which Swami (a really dedicated and appreciated AHUG member) showed me:
  725.  
  726. on enterKey
  727.   global myLastMsg
  728.   if the optionKey is down then
  729.     put myLastMsg
  730.     exit enterKey
  731.   else
  732.     put the msg into myLastMsg
  733.   end if
  734.   pass enterKey
  735. end enterKey
  736.  
  737. on returnKey
  738.   global myLastMsg
  739.   if the optionKey is down then
  740.     put myLastMsg
  741.     exit returnKey
  742.   else
  743.     put the msg into myLastMsg
  744.   end if
  745.   pass returnKey
  746. end returnKey
  747.     
  748.     These scripts can reside in your Home stack script to be available in all of your HyperCard stacks.  They allow for a "recall" of a function (a function is used in HyperTalk to get information such as the current date or time or to compute a value within a script) you may have called.  If you type something like  "put the number of chars of fld 1" and press the Return or Enter key, you will get a response back in the message box such as "3521".  Well, suppose you wanted to see the number of characters of field 2?  Instead of retyping "put the number of chars of fld 2", just hold down the Option key and type the Return key or Enter key again.  Voila!  You can now backspace once, type in "2", and type Return to get the number of characters in field 2.  Instead of retyping 32 keystrokes, you've only typed 4.  Quite a savings! 
  749.  
  750. ------------------------------------------------------------------------
  751.  
  752. Sticking Windoids 
  753. by Paul Foraker of HyperPro
  754.  
  755. As a Mac II user, I got tired of the menu bar disappearing as I browsed through other people's stacks, and decided to prevent it with this simple handler:
  756.     
  757. on hide what
  758.     if what = "menubar" then
  759.     -- don't hide the menubar
  760.     else pass hide
  761. end hide
  762.  
  763. Put that script in your Home stack script and your menu bar will stick around.
  764. The "hide" that you get, by the way, is not a HyperTalk command, but is rather a system message.  It's sent to the current card.  The fact that it is a system message means that whether you type "hide menubar" into the message box, or use Command-SpaceBar, the "hide" message gets sent to the current card.
  765. Similarly, you can keep your message box, tool window, and pattern window visible.  Try this:
  766.  
  767. on hide what
  768.     if what = 3 then
  769.         -- don't hide the tool window
  770.     else pass hide
  771. end hide
  772.  
  773. Now make your tool windoid visible and type "hide tool window" into the message box.  It doesn't hide.  But if you click in the tool window's close box, It'll go away.  That's because the "hide" that gets sent in the message box is a HyperTalk command, and the "hide" a close box executes (hope that makes sense) is a system message.  When "hide is sent as a system message, the only value the parameter variable "what" can have is "menubar".
  774. If the tool window is identified by a "3" what about the other windows.
  775.             1 = card window
  776.             2 = pattern window
  777.             3 = tool window
  778.             4 = message box
  779. So to keep your message box showing, put this handler in your Home stack.
  780.     
  781. on hide what
  782.     if what = 4 then
  783.         -- keep my message box visible
  784.     else pass hide
  785. end hide
  786.  
  787. Sometimes a good designer will hide everything except the card window in order to give you the maximum benefit of the graphic animation or slide show that is to follow.  A polite designer, however, will have the script remember whether those objects were visible, and then re-show them at the end of the animation.  A simple script for that might be:
  788.  
  789. on openCard
  790.     put the visible of the msg into visiMsg
  791.     put the visible of tool window into visiTool -- not "the" tool     --window
  792.     put the visible of pattern window into visiPat
  793.     hide the msg
  794.     hide tool window
  795.     hide pattern window
  796.     -- do your thing
  797.     set the visible of the msg to visiMsg
  798.     set the visible of tool window to visiTool
  799.     set the visible of pattern window to visiPat
  800. end openCard
  801.  
  802. ------------------------------------------------------------------------
  803.  
  804. HyperCard version 1.2.2 Final Programmer╒s Notes
  805. By Mike Holm
  806. ⌐ Apple Computer, Inc.  1988
  807.  
  808. HyperCard version 1.2.2 is a maintenance release with a number of bug fixes, better support for foreign languages and a few small enhancements.
  809.  
  810. These notes contain information of interest to stack designers and programmers that are not covered in the general HyperCard Version 1.2.2 Release Notes stack.  The HyperCard version 1.2.2 Programmer's Notes  include the following:
  811.  
  812.     Ñ  Script Examples and detailed explanations of enhancements.
  813.     Ñ  Explanations of bug fixes.
  814.  
  815. Briefly, HyperCard 1.2.2 includes the following:
  816.  
  817.     Ñ  Improved support for display and printing of Japanese,         Arabic and other non-Roman languages.
  818.     Ñ  Improvements in handling sound (in conjunction with Sound         Manager fixes in System 6.0.2).
  819.     Ñ  Overall improved robustness in low-memory situations.
  820.     Ñ  Parameters returned by HyperCard's Find command have         been enriched and are more accurate.
  821.     Ñ  A variety of bug fixes.
  822.  
  823. NOTE:  Developers who plan to license and ship HyperCard with their products outside the United States should use version z1.2.2, which contains a special resource for handling non-U.S. date, currency and other number formats.  Contact Apple Software Licensing for details on distributing HyperCard with third-party products.
  824. Enhancements:
  825.  
  826. Ñ  Pasting fields with the Shift key down
  827.  
  828. If the Shift key is pressed while pasting a field,  HyperCard 1.2.2 will paste the field AND put the text of the copied or cut field into it.
  829. Whether pasting a field into a card or background, text for the current card will be put into the pasted field.  Copying and pasting a field with the Shift key can be done in a HyperTalk handler as follows:
  830.  
  831. on mouseUp
  832.   select cd fld 1
  833.   doMenu "Copy Field"
  834.   go next card
  835.   type "V" with commandKey,shiftKey --paste it with the 
  836. --shiftKey down
  837.   choose browse tool
  838. end mouseUp
  839.  
  840. NOTE:  The doMenu command cannot be used to Shift-Paste a field as it takes only one argument.
  841.  
  842. Ñ  Placing a Paint graphic while drawing
  843.  
  844. HyperCard 1.2.2  allows rectangles, ovals, and regular polygons to be placed (by sliding them around the screen) while they are being created.
  845.  
  846. With the rectangle, round rectangle, oval, or regular polygon tool chosen the user drags the mouse to stretch out the shape.   Without releasing the mouse button,  pressing the Command key will stop stretching and allow sliding the graphic. Releasing the Command key resumes stretching.
  847.  
  848. This capability is only available while the user is working with the painting tools, keyboard and mouse directly; it cannot be programmed in a HyperTalk handler.
  849.  
  850. Ñ  Faster navigation
  851.  
  852. Going to the previous card for a specified background is faster.   For example:
  853.  
  854. on mouseUp
  855.     go to prev card of bkgnd "Foo"
  856. end mouseUp
  857.  
  858. Support for Foreign Languages:
  859.  
  860. Ñ    Right justified and right-to-left text
  861.  
  862. HyperCard 1.2.2 correctly frames (draws the box around) text found by HyperCard's Find commands when text is left, center or right justified, and when operating in languages which read right-to-left.
  863. Reset Paint will use right justification for Paint text if right-to-left text has been set by the Script Manager.  This restores the defaults to what would be expected on a Kanji, Arabic or Hebrew language system. 
  864.  
  865. Ñ    Printing
  866.  
  867. HyperCard 1.2.2 will print Kanji characters in high-quality mode on the ImageWriter II and ImageWriter LQ printers.
  868. HyperCard 1.2.2 uses the default font set by the Script Manager for printing reports.   
  869.  
  870. Bug Fixes:
  871.  
  872. Ñ    Behavior in low-memory conditions
  873.  
  874. HyperCard 1.2.2 has a fix for the operating system Scrap Manager to help it when memory is running low.  When cutting or copying a HyperCard object or graphic under low memory conditions (i.e., as would be created by repeated copying and pasting on a 1 MB system),  HyperCard could sometimes receive a corrupted copy of the object when it was pasted by a user or HyperTalk handler.  This bad copy could cause the system to hang or corrupt the HyperCard stack being used.  This fix, along with several smaller ones, make HyperCard 1.2.2 much more robust when running on a 1 MB Macintosh, or in a small partition under MultiFinder.
  875.  
  876. Ñ     Appending Scripts
  877.  
  878. Sometimes when memory was running low the beginning of a stack script was lost when another handler attempted to append something to the end of the script.  This has been fixed.
  879.  
  880. Ñ    Sound on 1 Megabyte systems, Mac Plus and SE
  881.  
  882. System 6.0.2 fixed a number of small problems with recent releases of the Macintosh Sound Manager.  HyperCard 1.2.2 has a fix for gaining and releasing the sound channel which supports desk accessories, modal dialogs or other software that uses sounds.  This eliminated known sound problems including system hangs and occasional clicks and pops on the Macintosh Plus and SE, and provides better handling of synthesized and digitized sounds in general.
  883.  
  884. Ñ    The "Find" command
  885.  
  886. Getting parameters for a Find command is now fully implemented, so HyperCard 1.2.2 returns more information when asked for ╥the params╙.  These improvements allow stack designers to intercept a Find command, examine it in detail, then modify, terminate, execute or override it inside a handler.
  887. HyperCard 1.2.2 returns the string to be found with quotes (which can be important for conditional HyperTalk statements to multi-word searches), and also returns a complete field expression, instead of just "<field>". 
  888.  
  889. For example, if the command:
  890. find whole "My Name" in bkgnd fld "Foo"
  891. were intercepted by the handler:
  892.  
  893. on Find
  894.    send the params to HyperCard
  895.    if the result is empty then exit find
  896.    lock screen   
  897.    push card
  898.    go to stack "server:Address"
  899.    send the params to HyperCard --search in this stack too
  900.    if the result is empty then exit find
  901.    pop card  -- return to original stack
  902. end Find
  903.  
  904. Inquiring about "the params" would return the following literal results:
  905.  
  906. find whole My Name in <field> -- for version 1.2.1 and 1.2
  907. find whole "My Name" in bkgnd field 2 -- for version 1.2.2
  908.  
  909. NOTE:  If the Find command contains a field name (e.g., bkgnd fld "Foo"), HyperCard converts the name into the field number (e.g., bkgnd field 2).  
  910.  
  911. A simpler command like:
  912.  
  913. find "My Name"
  914. would return:
  915. find 0 My Name -- for version 1.2.1 and earlier  
  916. find normal "My Name" -- for version 1.2.2
  917.  
  918. NOTE:  In simple Find commands, version 1.2.2 returns "normal" in the second item (instead of "0"), indicating the Find command was not followed by modifiers like "whole" or "string".
  919.  
  920. Ñ     Closing open fields at the start of a Find command
  921.  
  922. HyperCard now closes the currently open field (one where there is a flashing cursor) when a search is initiated via the Find command.  This should eliminate situations where Find would return an invalid result.
  923.  
  924. Ñ    Sending the Choose message
  925.  
  926. In earlier versions, when the user clicked on a tool in the tool windoid, HyperCard did not send the Choose message.  Now it does.  This is useful when a designer wants to figure out which tool the user has chosen from the palette.  For example:
  927.  
  928. on choose what,whichTool
  929.    if what is "tool" and whichTool is "7" then beep
  930.     -- beep when the brush tool is chosen
  931.    pass choose -- do it
  932. end choose
  933.  
  934. NOTE:  The Choose message passes the word "tool" and a number, not a tool name.
  935.  
  936. Ñ    Scrolling fields
  937.  
  938. The scrollbar is now updated after cutting or deleting text from a scrolling field, so the field can now be scrolled back to the top with the mouse after cutting or deleting text from the bottom. 
  939. Text Arrows now update the scrollbar and scroll setting properly.  Previous versions did not update the scrollbar when text arrows were used to scroll up and down the field.
  940.  
  941. Ñ    Painting tools with hidden pictures
  942.  
  943. If the picture is hidden you can no longer get "marching ants╙ by double-clicking the selection tool.
  944. If the picture is hidden you can no longer set an insertion point by choosing the text tool and clicking the mouse.
  945.  
  946. Ñ    Typing in locked stacks
  947.  
  948. A bug in HyperCard 1.2.1  allowed users to type carriage returns into fields in a locked stack, even though the userModify property was set to false.  This has been fixed.
  949.  
  950. Ñ    Working with custom FOND resources
  951.  
  952. A bug allowed a custom FOND attached to a stack to be purged, but a Font Manager global still referred to it.  This could corrupt HyperCard's heap; it has been fixed.
  953.  
  954. Ñ    Font substitution with the ImageWriter LQ
  955.  
  956. If the 3x fonts for the ImageWriter LQ are available, HyperCard will now use them.
  957.  
  958. Ñ    Going to other stacks while deleting a card
  959.  
  960. Earlier versions of HyperCard would result in an Unexpected Error #1250 or 1260 if a user (via a script) left the stack in a delete or openCard handler.  This has been fixed.
  961.  
  962. Ñ    Copying the selection
  963.  
  964. Earlier versions of HyperCard accidentally copied the entire text of a source container when a handler requested that the selection (highlighted text) be put after the contents of a destination container.  Version 1.2.2 fixes this.
  965.  
  966. Ñ    the diskSpace
  967.  
  968. The diskSpace property now returns the correct available diskspace when it's more than 32 MB. 
  969.  
  970. Ñ    Visual effects on "E-Machines" type large monitors
  971.  
  972. Visual effects now work with monitors which change low-memory screen globals.  
  973.  
  974. Ñ    Flush mouseUp event before sending the mouseUp message
  975.  
  976. When a button was clicked on and the message was sent prior to the event being removed from the queue, XCMDs were getting confused by the extra event.  This is fixed.  
  977.  
  978. Ñ    Suspend/Resume
  979.  
  980. In some sublaunch situations where the user had to find the application with Standard File, a bug resulted in weird looking screens on return to HyperCard.  This has been fixed.
  981.  
  982.  
  983. ------------------------------------------------------------------------
  984.  
  985. Editor's AfterWord
  986. by David Leffler
  987.  
  988. We hope you have enjoyed reading this latest issue of WINDOID and have found it to be interesting and informative.  Please remember that the purpose of this newsletter is to help you help us to make a quality difference in the world. We provide a unique opportunity for WINDOID readers to contribute to the ongoing growth and excellence of Apple's HyperCard¬ and would like to make a request for a little of your time.  
  989.  
  990. There is a form at the back of this, and every, issue of WINDOID that allows you to communicate directly with the HyperCard Team. Bill, Dan, and the entire team really want to know what you would like to see in HyperCard and are more than willing to give you what you want. What we need to make this happen is your input. We want to know what you like, and what you don't like, about HyperCard and what features or suggestions you would like to see implemented in future versions. If you have a problem we can address it in WINDOID or perhaps the next revision of HyperCard. You can make a difference in the world by communicating with us. Don╒t pass up the opportunity!
  991.  
  992. For those that wrote to us and participated in HyperCard 1.2.1 and 1.2.2, we thank you. I believe that you will be very pleased you took the time to make yourself heard.
  993.  
  994. For those of you that would like additional copies of this WINDOID, or back issues, you must send us a stamped-self-addressed-envelope for each one.  We will be unable to send you anything without them.  If you send us a very large manilla envelope for all of the issues, please put on enough postage for about sixty (60) pages. 
  995. Bryan has put together a mailing list and will be telling you how to receive regular copies as I publish them. Again, if you like HyperCard and WINDOID, please let us know.  Individuals make a difference!     
  996.  
  997. If you would like information about AHUG, write to: 
  998. Apple HyperCard User Group
  999. MS/27-AHUG
  1000. 20525 Mariani Ave.
  1001. Cupertino, CA 95014
  1002. Our AppleLink is:  UG.AHUG 
  1003.  
  1004. ------------------------------------------------------------------------
  1005. THE FORM
  1006.  
  1007. If you have a bug, suggestion, comment, or just want to know the best way to do something in HyperCard, you can fill out the form below and send it to:
  1008.  
  1009. AHUG c/o David Leffler
  1010. Apple Computer, Inc.
  1011. MS/22-0
  1012. 20525 Mariani Ave.
  1013. Cupertino, CA 95014
  1014.  
  1015. Or copy the format and
  1016. AppleLink(TM) it to:
  1017. HYPERBUG$
  1018.  
  1019. ------------------------------------------------------------------------
  1020.  
  1021. TELL HYPERCARD
  1022. You can use this form to notify the HyperCard team of problems, bugs, and enhancement requests.
  1023.  
  1024. THE FORM:
  1025.  
  1026. Please use the following form to make a difference in the world:
  1027.  
  1028. Date:
  1029. Name:
  1030. Address:
  1031. Phone #:
  1032. Versions of:
  1033. a.  HyperCard:
  1034. b.  Associated software:
  1035. c.  System Software:
  1036. 1. System
  1037. 2. Finder
  1038. 3. ImageWriter file
  1039. 4. LaserWriter file
  1040. 5. Any others
  1041. Type of Macintosh:
  1042. Peripherals:
  1043. Description of problem, suggestions or comments:
  1044.  
  1045.  
  1046. If you have some information for us please fill this form out as completely as possible and send it to us.  You will be glad you did!
  1047.  
  1048. ------------------------------------------------------------------------
  1049.  
  1050. MERRY CHRISTMAS AND HAPPY NEW YEAR
  1051. FROM THE WINDOID STAFF
  1052.  
  1053. Editor:  David Leffler
  1054. Copyeditor:  Sandy Tompkins
  1055. Writers:  Members of the HyperCard Team and our very good friends.
  1056.